<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
        <!-- Slide meta data, remove/edit as you see fit -->
        <title>Знайомтесь - Python</title>
        <meta name="generator" content="Vim" />
        <meta name="author" content="Буник Тарас" />
        <meta name="company" content="Факультет Кібернетики КНУ" />
        <meta name="email" content="tbunyk@gmail.com" />
        <meta name="presdate" content="unknown" />
        <!-- Slippy core file and dependencies -->
        <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
        <script type="text/javascript" src="jquery.history.js"></script>
        <script type="text/javascript" src="slippy-0.9.0.js"></script>
        <!-- Slippy structural styles -->
        <link type="text/css" rel="stylesheet" href="slippy-0.9.0.css"/>
        <!-- Slippy theme -->
        <link type="text/css" rel="stylesheet" href="slippy-dark.css"/>
        <!-- Syntax highlighting core file  -->
        <script type="text/javascript" src="highlighter/shCore.js"></script>
        <!-- Syntax highlighting brushes, remove those you don't need -->
        <script type="text/javascript" src="highlighter/shBrushBash.js"></script>
        <script type="text/javascript" src="highlighter/shBrushCpp.js"></script>
        <script type="text/javascript" src="highlighter/shBrushCSharp.js"></script>
        <script type="text/javascript" src="highlighter/shBrushCss.js"></script>
        <script type="text/javascript" src="highlighter/shBrushDelphi.js"></script>
        <script type="text/javascript" src="highlighter/shBrushDiff.js"></script>
        <script type="text/javascript" src="highlighter/shBrushGroovy.js"></script>
        <script type="text/javascript" src="highlighter/shBrushJava.js"></script>
        <script type="text/javascript" src="highlighter/shBrushJScript.js"></script>
        <script type="text/javascript" src="highlighter/shBrushPhp.js"></script>
        <script type="text/javascript" src="highlighter/shBrushPlain.js"></script>
        <script type="text/javascript" src="highlighter/shBrushPythonTerm.js"></script>
        <script type="text/javascript" src="highlighter/shBrushPython.js"></script>
        <script type="text/javascript" src="highlighter/shBrushRuby.js"></script>
        <script type="text/javascript" src="highlighter/shBrushScala.js"></script>
        <script type="text/javascript" src="highlighter/shBrushSql.js"></script>
        <script type="text/javascript" src="highlighter/shBrushVb.js"></script>
        <script type="text/javascript" src="highlighter/shBrushXml.js"></script>
        <!-- Syntax highlighting styles-->
        <link type="text/css" rel="stylesheet" href="highlighter/shCore.css"/>
        <link type="text/css" rel="stylesheet" href="highlighter/shThemeEclipse.css"/>
        <!-- Slippy init code -->
        <script type="text/javascript">
            $(function() {
                $(".slide").slippy({
                    // settings go here
                    // possible values are:
                    //  - animLen, duration for default animations (0 = disabled)
                    //  - animInForward, receives a slide and animates it
                    //  - animInRewind, receives a slide and animates it
                    //  - animOutForward, receives a slide and animates it
                    //  - animOutRewind, receives a slide and animates it
                    //  - baseWidth, defines the base for img resizing, if you don't want only
                    //    full-width images, specify this as the pixel width of a slide so that
                    //    images are scaled properly (default is 620px wide)
                    //  - ratio, defines the width/height ratio of the slides, defaults to 1.3 (620x476)
                });
                SyntaxHighlighter.all();
            });
            
            var hintvisibility=false;
            $(document).ready(function(){
			$(".handout").slideToggle(0);
                	$("#helpbutton").click(function() {
                		hintvisibility=!hintvisibility;
                		if(hintvisibility){
                			$(".handout").slideToggle("slow");
                			$.alert("Підказки для доповідача увімкнені.");
                		} else
                		{
                			$(".handout").slideToggle("slow");
                			$.alert("Підказки для доповідача вимкнені.");
                		}
                	});
                });
            
        </script>
        <!-- Custom style for this deck -->
        <style type="text/css">
            .slide.nochrome {
                border: 0;
                background: 0;
            }
            .handout {
            	/*visibility:hidden;*/
            	background: 0;
		border: solid;
            	border-width: 3;
            	border-color: green;
            }
            .licensenote
            {
            	position:absolute;
            	right:0px;
            	bottom:0px;
            	z-index:-2;
            	font-size:small;
            }
        </style>
    </head>
    <body>
    
<span id="helpbutton" title="Показати/сховати підказки">?</span>

<div class="slide">
	<h1>Знайомтесь - Python</h1>
	<center><img src="images/logo.png" / alt="Якщо ви не бачите картинки - натисніть F5"></center>
	<br /><hr /><br />
	<h3><a href="http://www.bunyk.wordpress.com/">Буник Тарас</a></h3>
	<h4>tbunyk < на > gmail.com < або > ukr.net (краще gmail)</h4>
	
	<br /><hr /><br />
	<h3>Зроблено з <a href="http://github.com/Seldaek/slippy/">Slippy</a></h3>	
	<br /><hr /><br />
	<p>Щоб почати презентацію натисніть F11, а потім вправо, або прогалик.</p>
	<p>Натисніть "?" зліва вгорі, щоб показати/cховати додаткові коментарі.</p>
	<div class="handout">
		Зараз ви бачите додаткові коментарі.
		<br />
		<p><em>Початково ця презентація розраховувалась на великих дядь, які вже програмували на всьому крім Пайтона, тому вона може бути занадто стисла як на тих хто вперше знайомиться з програмуванням. Та все ж можете ризикнути. Якщо потім поділитесь враженнями - можу дещо розжувати. Я ж не все що треба розказувати записував в коментарі.</em></p>
	</div>
</div>

<div class="slide">
	<h1>Походження та історія</h1>
	
	<p>Розроблена у 1990 Ґвідо Ван Россумом.</p>
	<br />
	<p>Змія чи "Пайтон"? Монті Пайтон!</p>
	<img align="right" src="images/guido.jpg" />
	<br />
	<p>Чиї гени?</p>
	<ul>
		<li><b>С, С++</b> - деякі синтаксичні конструкції</li>
		<li><b>Smalltalk</b> - ООП</li>
		<li><b>Lisp</b> - функціональне програмування</li>
		<li><b>FORTRAN</b> - зрізи масивів, велика бібліотека чисельних методів</li>
		<li><b>Modula-3</b> - модулі, іменовані параметри функцій.</li>
	</ul>
	<div class="handout">
	</div>
</div>

<div class="slide">
	<h1>Cфери застосування</h1>
	<ul>
		<li>Освіта (простий як Паскаль)</li>
		<li>Наука (дружить з Фортраном)</li>
		<li>Обробка текстів (зокрема XML)</li>
		<li>Вбудована скриптова мова (ігри, Blender)</li>
		<li>Web-програмування (PHP відпочиває)</li>
		<li>Графічні інтерфейси (GTK, Qt, Tk...)</li>
	</ul>
</div>

<div class="slide">
	<h1>Мову використовують:</h1>
	<center class="vcenter">
	<img src="images/google.png" /> 
	<br />(у них працює сам Ґвідо, та Марк Пілгрим)
	</center>
</div>

<div class="slide">
	<h1>Мову використовують:</h1>
	<center class="vcenter">
	<img src="images/ibm.jpg" /> 
	</center>
</div>

<div class="slide">
	<h1>Мову використовують:</h1>
	<center class="vcenter">
	<img src="images/yahoo.jpg" /> 
	</center>
</div>

<div class="slide">
	<h1>Мову використовують:</h1>
	<center class="vcenter">
	<img src="images/HP.JPG" /> 
	</center>
</div>

<div class="slide">
	<h1>Мову використовують:</h1>
	<center class="vcenter">
	<img src="images/NASA.jpg" /> 
	</center>
</div>

<div class="slide">
	<h1>Мову використовують:</h1>
	<center class="vcenter">
	<img src="images/mit_logo.gif" /> 
	</center>
</div>


<div class="slide">
	<h1>Особливості</h1>
	<ul>
		<li>вільно-розповсюджувана</li>
		<li>дуже високого рівня</li>
		<li>інтерпретована (хоча можлива компіляція)</li>
		<li>багатопарадигмова (ООП, функціональне програмування, процедурне програмування...)</li>
		<li>можливість розширення (модулями на С)</li>
		<li>можливість вбудовування інтерпретатора в свої програми.</li>
		<p>і про це та інше далі трохи детальніше.</p>
	</ul>
	<div class="handout">
	</div>
</div>

<div class="slide">
	<h1>Оболонки інтерпретатора?</h1>
	<center>Вивчати особливості Python зручно в інтерпретаторі, який виконує команди одразу<br />
	<img src="images/bpython.png" height="70%"/>
	<br />
	На знімку <b>bpython</b>.</center>
</div>

<div class="slide">
	<h1>Посилання</h1>
	<p>Перед тим як перейти до власне до вивчення, треба дати джерела:</p>
	<ul>
		<li>Завантажити: <a href="http://www.python.org/download/">http://www.python.org/download/</a></li>
		<li>Документація: <a href="http://docs.python.org/">http://docs.python.org/</a></li>
		<li>Українські матеріали: <a href="http://uk.wikibooks.org/wiki/Python">http://uk.wikibooks.org/wiki/Python</a></li>
		<li>Підручник: <a href="http://diveintopython3.org/">http://diveintopython3.org/</a></li>
	</ul>
</div>


<div class="slide">
	<h1>Чистий синтаксис</h1>
Програма на C:
<pre class="brush: c;">
unsigned factorial(unsigned x) 
{
	if (x == 0) 
	{
		return 1;
	} 
	else 
	{
		return x * factorial(x-1);
	}
}
</pre>
Програма на Python:
<pre class="brush: python;">
	def factorial(x):
		if x == 0:
			return 1
		else:
			return x * factorial(x-1)
</pre> 
</div>

<div class="slide">
	<h1>Код короткий бо:</h1>
	<ul>
		<li>блоки виділяються табуляціями а не фігурними дужками (як у попередньому слайді)</li>
		<li>Тому натискаємо менше клавіші Shift. А ще не потрібна крапка з комою. Хоча її можна ставити, щоб не втрачати звичку в інших C-подібних мовах.</li>
		<li>структури даних високого рівня дозволяють виразити складні операції за допомогою окремих тверджень;</li>
		<li>декларація змінних чи аргументів не потрібна;</li>
	</ul>
<pre class="brush: python;">
x= [1,2,3] # Створити масив з трьох елементів
</pre>

	<div class="handout">
	</div>
</div>

<div class="slide">
	<h1>Типізація</h1>
Динамічна
<pre class="brush: bpy;">
>>> x=2
>>> type(x)
&lt;type 'int'>
>>> x="2"
>>> type(x)
&lt;type 'str'>
</pre>
але строга:
<pre class="brush: bpy;">
>>> 2+'2'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
>>> 2+ord('2')
52
</pre> 
</div>

<div class="slide">
	<h1>Python - калькулятор</h1>
	<p>Калькуляторів існує багато</p>
<pre class="brush: plain;">
$ man -k calculator
bc (1)               - An arbitrary precision calculator language
dc (1)               - an arbitrary precision calculator
gcalctool (1)        - a desktop calculator
gnome-calculator (1) - a desktop calculator
xcalc (1)            - scientific calculator for X
</pre>
Але чомусь забувають про найпотужніший, і разом з тим найпростіший:
<pre class="brush: bpy;">
Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41) 
...
>>> 2**65-1
36893488147419103231L
>>> from math import *
>>> cos(pi)
-1.0
</pre> 
	<div class="handout">
	і у всіх різні інтерфейси, різні набори функції, різний синтаксис та способи роботи. <code>dc</code> наприклад використовує ПОЛІЗ. <code>bc</code> - ще складнішу мову. 
	</div>
</div>

<div class="slide">
	<h1>Можливості калькулятора Python</h1>
	<p>Вбудовані комплексні числа:</p>
<pre class="brush: bpy;">
>>> 1j**2
(-1+0j)
>>> (1+2j)*(3+4j)
(-5+10j)
</pre>
Спеціальна змінна "<code>_</code>", яка зберігає результат останньої операції:
<pre class="brush: bpy;">
>>> 2+2
4
>>> _+2
6
</pre> 
Операції зі звичайними дробами:
<pre class="brush: bpy;">
>>> from fractions import Fraction as f
>>> f(1,2)*f(1,3)
Fraction(1, 6)
</pre> 
</div>

<div class="slide">
	<h1>Рядки</h1>
Рядки в Python задаються як подвійними так і одинарними лапками:
<pre class="brush: bpy;">
>>> "Hello "+'world!'
'Hello world!'
</pre>
<pre class="brush: python;">
""" Також можливі 
багаторядкові рядки, як би дивно це не звучало...
Починаються вони трьома лапками, наприклад '''
і закінчуються трьома лапками такого ж типу: """
</pre>
Ескейп-символи, та чисті рядки:
<pre class="brush: bpy;">
>>> "\n"
'\n'
>>> r"\n"
'\\n'
</pre>

З рядками можна робити ті ж операції що і в інших мовах, конкатенувати, індексувати:
<pre class="brush: bpy;">
>>> hw="Hello"+"world!"
>>> hw[0]
'H'
>>> hw[1]
'e'
</pre>
</div>

<div class="slide">
	<h1>Індексація та зрізи</h1>
Крім того, можна індексувати рядки задом наперед:
<pre class="brush: bpy;">
>>> hw
'Hello world!'
>>> hw[-1]
'!'
>>> hw[-2]
'd'
</pre>
А також вирізати з рядка довільний шматок:
<pre class="brush: bpy;">
>>> hw[6:-1]
'world'
>>> hw[5:]
' world!'
>>> hw[:6]
'Hello '
>>> hw[:5]
'Hello'
>>> hw[:]
'Hello world!'
</pre>
</div>

<div class="slide">
	<h1>Інтроспекція</h1>

<p>Інтроспекція - це здатність програми знати щось про себе.</p>
<p>Функція <code>dir()</code> повертає список атрибутів об'єкта. І ми можемо переконатись що в Python все - об'єкти:</p>
<div class="handout">А dir() без параметрів дає нам список локально доступних об'єктів.</div>
<pre class="brush: bpy;">
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'help']
>>> import math
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'help', 'math']
>>> dir(math)
['__doc__', '__name__', '__package__', 'acos', 'acosh', 'asin', ... , 'trunc']
>>> math.pi
3.1415926535897931
>>> dir(math.pi)
['__abs__', ... , 'is_integer', 'real']
>>> dir("String!")
['__add__', ... , 'translate', 'upper', 'zfill']
</pre>
<p>Списки вище що містять три крапки - скорочені.</p>
</div>

<div class="slide">
	<h1>Інтроспекція - типи</h1>

<p>Інший вид інтроспекції - інформація про типи. Що теж допомагає нам дізнатись щось про мову.</p>
<pre class="brush: bpy;">
>>> type(2)
&lt;type 'int'>
>>> type(2.5)
&lt;type 'float'>
>>> type(True)
&lt;type 'bool'>
>>> type("adfasf")
&lt;type 'str'>
>>> type(dir)
&lt;type 'builtin_function_or_method'>
>>> type(math)
&lt;type 'module'>
>>> type(type(1))
&lt;type 'type'>
</pre>
<p>Все має свій тип. Навіть типи.</p>
</div>

<div class="slide">
	<h1>Батарейки</h1>

<p>Кілька способів додавання об'єктів з іншого модуля:</p>
<pre class="brush: bpy; highlight:[3,6,9,12]">
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'help']
>>> import math
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'help', 'math']
>>> from math import sin
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'help', 'math', 'sin']
>>> from math import sin as sinus
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'help', 'math', 'sin', 'sinus']
>>> from math import *
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'acos', 'acosh', ... , 'tanh', 'trunc']

</pre>
</div>

<div class="slide">
	<h1>Умовний оператор</h1>
	
<pre class="brush: python;">
if d&lt;0:
	print "Немає розв'язку"
elif d==0:
	print -b/2/a
else:
	print (-b+sqrt(d))/2/a
	print (-b-sqrt(d))/2/a
</pre>	
<p>В кінці умовного оператора, операторів циклів, і взагалі всього після чого йде блок операторів ставлять двокрапку.</p>
<div class="handout">
Case немає, але його й не треба. 
</div>
</div>

<div class="slide">
	<h1>Цикли:</h1>
З передумовою:
<pre class="brush: python;">
x=1
while x&lt;10:
	print x
	x+=1
</pre>	

Перелічування:
<pre class="brush: python;">
list="Hello!"
for i in list:
	print i
</pre>

<pre class="brush: plain;">
H
e
l
l
o
!
</pre>
<pre class="brush: bpy;">
>>> range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
</pre>
<div class="handout">
 А також є xrange, який не генерує цей список в пам'яті, а імітує таку діяльність.
</div>
</div>

<div class="slide">
	<h1>Спеціальні оператори</h1>
<p>Оператор <code>break</code>, як і в C виходить з циклу.</p>
<p>Оператор <code>continue</code>, завершує ітерацію і починає нову</p>
<p>Оператори циклу також можуть мати частину з <code>else</code>, яка виконується коли перестає виконуватись умова циклу. (Після виходу з циклу але не за допомогою <code>break</code>).</p>
<pre class="brush: python;">
for n in range(2, 7):
	for x in range(2, n):
        	if n % x == 0:
			print n, 'дорівнює', x, '*', n/x
			break
	else:
		print n, 'просте число'
</pre>
<pre class="brush: plain;">
2 просте число
3 просте число
4 дорівнює 2 * 2
5 просте число
6 дорівнює 2 * 3
</pre>	

<p>Оператор <code>pass</code> нічого не робить. </p>
<pre class="brush: python;">
while True:
	pass
</pre>
<div class="handout">
</div>
</div>

<div class="slide">
	<h1>Модульність</h1>
	<p>Модулі в Python є звичайними файлами .py, що містять функції та класи що імпортуються. Щоправда багато системних модулів не мають Python-коду, бо написані на C.</p>
	
<p>Таким чином в Python реалізується процедурна парадигма:</p>
<pre class="brush: python;">
def func1():
	print "Hello, I am func1"

	def func2():
		print "Hello, I am func2"
	
	func2()

func1()
</pre>	
<p>Результат роботи:</p>
<pre class="brush: plain;">
Hello, I am func1
Hello, I am func2
</pre>
</div>

<div class="slide">
	<h1>Аргументи</h1>
Передача по імені:
<pre class="brush: python;">
def add(x,y):
	return x+y
</pre>	
<div class="handout">
Зауважте, тип аргументів не вказується, тобто функція прийме будь-які. А помилку викличе лише в тому разі, якщо для x та y не описаний відповідний оператор +.
</div>
<p>Щоб в довільному місці вийти з функції яка не повертає жодного значення потрібно просто написати <code>return</code>.</p>
<pre class="brush: python;">
def donotning(x,y):
	return
</pre>
<p>Хоча насправді, як і кожна функція вона поверне значення. Це стандартне значення <code>None</code> (щось на зразок <code>NULL</code> в С). А його тип - <code>NoneType</code>, аналог <code>void</code>.</p>
</div>
<div class="slide">
	<h1>Глобальні змінні</h1>
<p>Описуються якось так:</p>
<pre class="brush: python;">
def zero_x():
	global x
	x=0
</pre>
і вийде:
<pre class="brush: bpy;">
>>> x=2
>>> x
2
>>> zero_x()
>>> x
0
</pre>
<p><br /><br /><center>* * *</center><br /><br /></p>
<p>І перед тим, як розказати про ще цікавіші способи передачі параметрів в функції, треба трохи більше розказати про вбудовані типи даних.</p>
</div>

<div class="slide">
	<h1>Списки</h1>
<p>Список - це впорядкована множина елементів. Довільних. Наприклад інших списків...</p>
<pre class="brush: bpy;">
>>> a=["String", None, 42, ["Other list", [] ] ]
>>> a
['String', None, 42, ['Other list', []]]
>>> a[3]
['Other list', []]
>>> a[3][1]
[]
>>> a[3][0]
'Other list'
>>> len(a)
4
>>> len([])
0
</pre>	
<p>Загалом списки схожі на рядки, які містять не символи, а довільні об'єкти. Але є одне але...</p>
<div class="handout">
</div>
</div>

<div class="slide">
	<h1>Секрет списків</h1>
<p>Полягає в тому що вони передаються не по значенню, а по посиланню. А ще вони mutable. І якщо не звернути на це увагу, одного разу можна дуже здивуватись:</p>
	
<pre class="brush: bpy;">
>>> a=[1,2,3]
>>> b=a
>>> b
[1, 2, 3]
>>> a[1]="Change"
>>> b
[1, 'Change', 3]
</pre>	

<p>Тому присвоювання масивів потрібно робити так як в другому рядку:</p>
<pre class="brush: bpy; highlight:[2];">
>>> a=[1,2,3]
>>> b=a[:]
>>> a[1]="other"
>>> b
[1, 2, 3]
</pre>

<p>Це був оператор зрізу. <a href="#19">З слайду 19</a>, пам'ятаєте?</p>

<div class="handout">
</div>
</div>

<div class="slide">
	<h1>Можливості списків</h1>
<p>Їх можна змінювати - додавати, редагувати та видаляти елементи з в довільному місці. Що дозволяє імітувати масиви, стеки, черги і подібне.</p>
	
<pre class="brush: bpy;">
>>> a=[]
>>> a.append(1)
>>> a
[1]
>>> a.append(2)
>>> a
[1, 2]
>>> a.pop()
2
>>> a
[1]
>>> a=[1,1,1,1]
>>> a.insert(2,0)
>>> a
[1, 1, 0, 1, 1]
>>> a.pop(2)
0
>>> a
[1, 1, 1, 1]
</pre>

<div class="handout">
</div>
</div>

<div class="slide">
	<h1>Вивід</h1>
<p></p>
<pre class="brush: bpy;">
>>> print 1
1
>>> print 2
2
>>> print 1,2
1 2
>>> def print2():
...     print 1,
...     print 2
... 
>>> print2()
1 2
>>> print "I am agent %03d, and working for %s." % (7, "Mi-6")
I am agent 007, and working for Mi-6.
>>> print "My name is %(surname)s, %(name)s %(surname)s." % {"name":"James","surname":"Bond"}
My name is Bond, James Bond.
</pre>
</div>

<div class="slide nochrome">
	<div class="vcenter">
	<h1>На цьому перша лекція закінчується.</h1>
	<h1>Дякую за увагу!</h1>
	<h1>І можете задавати питання.</h1>
	</div>
</div>

<div class="slide">
	<h1>Привіт!</h1>
	<p>Зараз почнеться друга лекція. Перед тим як викладати новий матеріал варто було б згадати про що ми говорили раніше, і можливо відповісти на питання.</p>
	<p>Минулого разу ми говорили про:</p>
	<ul>
		<li>Де й чому використовують Python.</li>
		<li>Особливості синтаксису.</li>
		<li>Використання інтерпритатора як калькулятора.</li>
		<li>Рядки</li>
		<li>Зрізи</li>
		<li>Інтроспекція: <code>dir</code>,<code>type</code></li>
		<li>Як вмикати батарейки.</li>
		<li>Оператори: <code>if</code>,<code>else</code>, <code>elif</code>, <code>while</code>, <code>for</code>, <code>break</code>, <code>continue</code>, <code>pass</code></li>
		<li>Функції, аргументи</li>
		<li>Глобальні змінні</li>
		<li>Списки</li>
		<li>Вивід</li>
		<li>І це не так вже й мало! </li>
	</ul>
</div>

<div class="slide">
	<h1>Ввід</h1>
<p>За допомогою функції <code>input()</code>.</p>
<pre class="brush: bpy;">
>>> def io():
...     a=input("Input value here: ")
...     print "You inputted ",a
... 
>>> io()
Input value here: 2
You inputted  2
>>> io()
Input value here: 2+2
You inputted  4
>>> io()
Input value here: "a"
You inputted  a
>>> io()
Input value here: a
Traceback (most recent call last):
  File "&lt;input>", line 1, in &lt;module>
  File "&lt;input>", line 3, in io
  File "&lt;string>", line 1, in &lt;module>
NameError: name 'a' is not defined
</pre>
</div>

<div class="slide">
	<h1>Ввід</h1>
<p>За допомогою функції <code>raw_input()</code>.</p>
<div class="handout">В Python 3 <code>input</code> буде поводитись як <code>raw_input</code>. Це варто мати на увазі, але до Python 3 я ще не переходжу.</div>
<pre class="brush: bpy;">
>>> a = raw_input()
a
>>> print a
a
>>> a = raw_input()
2+2
>>> a
'2+2'
>>> def sqr():
...     a=raw_input()
...     print a**2
... 
>>> sqr()
2
Traceback (most recent call last):
  File "&lt;input>", line 1, in &lt;module>
  File "&lt;input>", line 4, in sqr
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
</pre>
</div>

<div class="slide">
	<h1>Кортежі</h1>
	<p>Кортеж - це теж саме що й список, тільки <code>immutable</code>. Відповідно працює швидше, і не містить функцій що змінюють вміст. Специфічно використовується.</p>
<pre class="brush: bpy; highlight:[10]">
>>> a = (1,2,3)
>>> a
(1, 2, 3)
>>> a = 1,2,3
>>> a
(1, 2, 3)
>>> x,y,z=a
>>> x,y
(1, 2) 
>>> x,y = y,x
>>> x,y
(2, 1)
>>> x,
(2,)
</pre>
</div>

<div class="slide">
	<h1>Хитрий спосіб ініціалізувати списки</h1>
<pre class="brush: bpy;">
>>> (1,2)*10
(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2)
>>> bzz="b"+"z"*30
>>> bzz
'bzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
>>> tenzeros = [0]*10
>>> tenzeros
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
</pre>
</div>

<div class="slide">
	<h1>Видалення</h1>
	<p>Дивно як ми раніше до цього не дійшли.</p>
<pre class="brush: bpy;">
>>> a = [1,2,3,4]
>>> del a[1:-1]
>>> a
[1, 4]
>>> import math
>>> math.sin(0)
0.0
>>> del math
>>> math.sin(0)
...
NameError: name 'math' is not defined
</pre>
</div>

<div class="slide">
	<h1>Словники</h1>
	<p>Словник - це послідовність що індексується не числами, а будь-якими іншими об'єктами які називаються ключами. Наприклад словами.</p>
<pre class="brush: py;">
months = {
	"січень":31,
	"лютий":28,
	"березень":31,
	"квітень":30,
	"травень":31,
	"червень":30, 
	"липень":31, 
	"серпень":31, 
	"вересень":30, 
	"жовтень":31, 
	"листопад":30, 
	"грудень":31
	}
</pre>
</div>

<div class="slide">
	<h1>Ключі словника</h1>
	<center><h2>Мають мати хешовний тип</h2></center>
	<p>Об'єкт вважаєтсья хешовним, якщо він має якесь прив'язане до нього значення (хеш), яке не міняється протягом часу його існування, і може порівнюватись з іншими хешовними значеннями. Одному об'єкту відповідає один хеш, і з великою ймовірністю (для хороших хешів) майже навпаки.</p>
	<p></p>
	<p>Але хеш - це поняття математики, і алгоритміки. Якщо ви не зрозуміли, то поки що просто знайте, що ключами можуть бути об'єкти що не змінюються.</p>
	<p>Ключами можуть бути:</p>
	<ul>
	<li>Числа</li>
	<li>Рядки</li>
	<li>Кортежі об'єктів які можуть бути ключами.</li>
	<li>Класи з методом <code>__hash__()</code></li>
	</ul>
	<p>Ключами не можуть бути:</p>
	<ul>
	<li>Списки</li>
	<li>Словники</li>
	</ul>
</div>

<div class="slide">
	<h1>Словники</h1>
	<p>Тепер пограємось з місяцями</p>
<pre class="brush: bpy;">
>>> months["жовтень"]
31
>>> months["тринадцятий"]
Traceback (most recent call last):
.. блаблабла
KeyError: 'тринадцятий'
>>> months["тринадцятий"] = 13
>>> months["тринадцятий"]
13
>>> del months["лютий"]
>>> print ", ".join(months.keys())
квітень, січень, березень, серпень, травень, тринадцятий, червень, липень, листопад, жовтень, вересень, грудень
>>> "January" in months.keys()
False
>>> months.has_key(1)
False
</pre>
</div>

<div class="slide">
	<h1>Хитрий спосіб створення словника</h1>
<pre class="brush: bpy;">
>>> uk = ["Раз", "Два", "Три"]
>>> en = ["One", "Two", "Three"]
>>> zip(uk,en)
[('\xd0\xa0\xd0\xb0\xd0\xb7', 'One'), ('\xd0\x94\xd0\xb2\xd0\xb0', 'Two'), ('\xd0\xa2\xd1\x80\xd0\xb8', 'Three')]
>>> uk2en= dict(zip(uk,en))
>>> for k,v in uk2en.iteritems():
...     print k, "-", v
... 
Два - Two
Раз - One
Три - Three
</pre>
Ну, і загалом інша інфа про словники яка можне знадобитись знаходиться в документації. А ми будемо рухатись далі.
</div>

<div class="slide">
	<h1>Документування</h1>
	<p>Коли ви пишете код, важливо паралельно пояснювати що він робить. Особливо коли ви його будете читати через певний час.</p>
<pre class="brush: py;">
# Це однорядковий коментар. Він просто ігнорується інтерпритатором

def hello_world():
	" Це функція, що вітається зі світом "
	print "Hello world!"
	
""" 
А це -
багаторядковий рядок (multiline string)
який теж ігноруєтсья інтерпритатором, 
і по суті теж є коментарем.
"""

</pre>
<pre class="brush: bpy;">
>>> help(hello_world)
Help on function hello_world in module __main__:

hello_world()
    Це функція що вітається зі світом
(END) 
</pre>
</div>

<div class="slide">
	<h1>Черепаха</h1>
	<p>Текст нудний, давайте щось намалюємо. Точніше малювати будемо не ми, а черепашка-художник.</p>
	<center><img src="images/verdastelo.png" /></center>
<pre class="brush: py;">
import turtle
turtle.shape("turtle")
turtle.pencolor("green")
turtle.pensize(7)
for i in range(5):
	turtle.forward(100)
	turtle.right(180*4/5)
</pre>
</div>

<div class="slide">
	<h1>Черепаха</h1>
	<p>Як ви думаєте, що намалює ця програма?</p>
<pre class="brush: py;">
import turtle
def loop(fl, ra):
	for i in range(360/abs(ra)):
		turtle.lt(ra)
		turtle.fd(fl)
		
def lolop(fl,ra,fl2,ra2):
	for i in range(360/abs(ra)):
		turtle.lt(ra)
		loop(fl2,ra2)
		turtle.fd(fl)
		
lolop(15,5,2,10)
</pre>
</div>

<div class="slide">
	<h1>Щось таке:</h1>
	<center><img src="images/loloop.png" /></center>
</div>

<div class="slide">
	<h1>А якщо використати рекурсію, то можна й таке:</h1>
	<center><img src="images/turtleroll.png" /></center>
</div>

<div class="slide nochrome">
	<div class="vcenter">
	<h1>І тут ми маємо два варіанти:</h1>
	<h1>1. Я на дошці пояснюю як працює рекурсія на деревах.</h1>
	<h1>2. Ми прощаємось з черепашкою і переходимо до графіків функцій. (якщо ви читаєте це онлайн, то вибору немає)</h1>
	</div>
</div>

<div class="slide">
	<h1>List comprehension</h1>
	<p>Бачили колись подібний запис: <img src="images/math_set_notation.png" /> ?</p>
	<p>Виявляється його можна перекласти на Python дослівно:</p>
<pre class="brush: py;">
S = [ 2*x for x in range(100) if x**2 > 3 ]
</pre>
	<p>І це зазвичай використовують щоб обчислити список результатів якоїсь функції, для списку аргументів. Що ми і зробимо.</p>
</div>

<div class="slide">
	<h1>Побудова графіка</h1>
	<p>Бачили колись подібний запис: <img src="images/math_set_notation.png" /> ?</p>
	<p>Виявляється його можна перекласти на Python дослівно:</p>
<pre class="brush: py;">
S = [ 2*x for x in range(100) if x**2 > 3 ]
</pre>
	<p>І це зазвичай використовують щоб обчислити список результатів якоїсь функції, для списку аргументів. Що ми і зробимо.</p>
</div>

<div class="slide nochrome">
	<div class="vcenter">
	<h1>На цьому друга лекція закінчується.</h1>
	<h1>Дякую за увагу!</h1>
	<h1>Маєте питання?</h1>
	</div>
</div>

<div class="slide">
	<h1>Про що ще не говорилось (але поговорити варто)</h1>
<p>Навіть не уявляю в якому порядку воно має бути:</p>
<ul>
<li>Ввід-вивід: <ul><li>Файли</li><li>XML</li> <li>JSON</li> <li>Pickle</li></ul></li>
<li>Обробка виключень</li>
<li>ООП</li>
<li>Функціональна парадигма (генераторні вирази, чули колись?)</li>
<li>Документація і Sphinx</li>
<li>Пакети</li>
</ul>
<div class="handout">
</div>
</div>

        <div class="layout" name="default">
            <content></content>
            <!--div class="footer">
                <span class="right">by bunyk</span>
                <span class="left">Знайомтесь - Python</span>
                <span class="right">Slippy on <a href="http://github.com/Seldaek/slippy/">github</a></span>
                <span class="left">Blog <a href="http://seld.be/">seld.be</a></span>
                <span class="right">Twitter <a href="http://twitter.com/seldaek">@seldaek</a></span>
                <hr class="defloat" />
            </div-->
        </div>

        <div class="layout nochrome" name="alt">
            <content></content>
        </div>
<div class="licensenote">
This <span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/InteractiveResource" rel="dct:type">work</span> is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a>. <a rel="license" href="http://creativecommons.org/licenses/by-sa/3.0/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-sa/3.0/88x31.png" /></a>
</div>
</body>
</html>
